#include <stdio.h>/*该文件包含pringtf()等函数*/
#include <stdlib.h>/*该文件包含exit()等函数*/
#include <malloc.h>/*该文件包含malloc()等函数*/

typedef int DataType;/*定义DataType为int*/
typedef struct Node
{
    DataType data;
    struct Node *next;
} SLNode;


/*单链表初始化。初始化成功函数返回0，否则返回1。*/
int ListInitiate(SLNode **head){
    *head=(SLNode *)malloc(sizeof(SLNode));//申请头结点，由head指示其地址
    (*head)->next=NULL;//置结束标记NULL
    if(*head == NULL)
        return 0;
    else
        return 1;
}
/* 函数返回由head所表示的单链表的长度。*/
int ListLength(SLNode *head){
    int len;
    for (len = 0 ; head ->next != NULL; len++)
        head = head->next;

    return len;
}
// 在由head所表示的单链表里插入一个元素 x 到位置 i。
// 插入成功函数返回0，否则返回1。
int ListInsert(SLNode *head, int i, DataType x){
    SLNode *p,*q;
    int j;
    p = head;
    for(j = -1;p->next != NULL && j < (i-1);j++)
        //让指针P指向第i-1个结点
        p = p ->next;
    if(j != i-1){
        printf("插入元素位置参数错！");
        return 1;
    }
    q = (SLNode *) malloc(sizeof(SLNode));//生成新结点
    q ->data = x;//新结点数据域赋值
    q ->next = p ->next;
    p ->next = q;
    return 0;
}
// 在由head所表示的单链表里删除位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度减1。
int ListDelete(SLNode *head, int i, DataType *x){
    SLNode *p,*s;
    int j;
    p = head;
    for(j = -1; p ->next != NULL && p ->next->next != NULL && j < i-1 ; j++)
        //循环结束时指针P指向第i-1个结点
        p = p ->next;
    if(j != i-1){
        printf("删除数据元素位置参数错！");
        return 0;
    }
    s = p ->next;//指针S指向ai结点
    *x = s ->data;//把指针s所指结点的数据域值赋予x
    p ->next = p ->next->next;//删除
    free(s);//释放指针s所指结点的内存空间
    return 1;
}

// 在由head所表示的单链表里获取位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度不变。
int ListGet(SLNode *head, int i, DataType *x){
    SLNode *p;
    int j;
    p = head;
    for(j = -1; p ->next != NULL && j < i; j++)
        p = p->next;

    if(j != i){
        printf("取元素位置参数错！");
        return 0;
    }

    *x = p ->data;
    return 1;
}
// 释放所有的由head所表示的单链表里的元素节点（含头结点）。当释放完全成功时，函数返回0，否则返回1。
int Destroy(SLNode **head){
    SLNode *p,*p1;

    p = *head;
    for(;p!=NULL;)
    {
        p1 = p;
        p = p ->next;
        free(p1);
    }
    *head = NULL;
}